package Reportes;

import CalendarioDAOS.CalendarioDAO;
import Herramientas.Herramientas;
import TarryDAOS.ClientesDAO;
import TarryDAOS.ComprasDAO;
import TarryDAOS.RegistroEnvioDAO;
import TarryDAOS.TarryPedidosDAO;
import TarryDTOS.CarteraVencidaDTO;
import TarryDTOS.ConceptoOrdenCompraDTO;
import TarryDTOS.OrdenCompraDTO;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.util.Vector;

/**
 *
 * @author Alan Gonzalez
 */
public class Reportes {

    /**
     * ALAN GONZALEZ | ESTE METODO GENERA EL REPORTE DE CARTERA VENCIDA GENERAL
     *
     * @return
     */
    public String ReporteCarteraVencida(Vector registros, int tipoDocumento, String fechas) {
        Herramientas hh = new Herramientas();
        ClientesDAO clientesDAO = new ClientesDAO();
        String nombreReporteAleatorio = hh.cadenaAlfanumericaAleatoria(4);
        String rutaSalida = "C:/erp_reports/reporte" + nombreReporteAleatorio + ".pdf";
        CalendarioDAO calendario = new CalendarioDAO();
        RegistroEnvioDAO registroEnvio = new RegistroEnvioDAO();
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();

        String tituloDocumento = new String();

        switch (tipoDocumento) {
            case 1:
                tituloDocumento = "REPORTE GENERAL DE CREDITOS VENCIDO";
                break;
            case 2:
                tituloDocumento = "REPORTE GENERAL DE CREDITOS VENCIDOS DEL PERIODO COMPRENDIDO " + fechas;
                break;
            case 3:
                tituloDocumento = "";
                break;
        }

        Document pdf = new Document(PageSize.A4.rotate());
        try {
            PdfWriter.getInstance(pdf, new FileOutputStream(rutaSalida));
            pdf.open();

            Font fuenteHeader = new Font();
            fuenteHeader.setSize(25);
            fuenteHeader.setStyle(1);
            fuenteHeader.setFamily(BaseFont.COURIER);
            fuenteHeader.setColor(BaseColor.BLACK);

            Font fuenteTitulo = new Font();
            fuenteTitulo.setSize(11);
            fuenteTitulo.setStyle(1);
            fuenteTitulo.setFamily(BaseFont.COURIER);
            fuenteTitulo.setColor(BaseColor.BLACK);

            Font fuente2 = new Font();
            fuente2.setSize(9);
            fuente2.setStyle(1);
            fuente2.setFamily(BaseFont.COURIER);
            fuente2.setColor(BaseColor.BLACK);

            // ENCABEZADO DETALLES
            Paragraph fecha = new Paragraph();
            fecha.setAlignment(Element.ALIGN_RIGHT);
            fecha.setFont(fuente2);
            fecha.add("FECHA: " + calendario.getFechaActual() + "   HORA: " + calendario.getHoraActual()); // DATOS TOMADOS DEL SERVIDOR 
            pdf.add(fecha);

            Paragraph tituloHeader = new Paragraph();
            tituloHeader.setAlignment(Element.ALIGN_CENTER);
            tituloHeader.setFont(fuenteHeader);
            tituloHeader.add("DULCES TARRY");
            pdf.add(tituloHeader);

            Paragraph titulo = new Paragraph();
            titulo.setAlignment(Element.ALIGN_CENTER);
            titulo.setFont(fuenteTitulo);
            titulo.add(tituloDocumento);
            pdf.add(titulo);

            Paragraph sep = new Paragraph();
            sep.setAlignment(Element.ALIGN_CENTER);
            sep.setFont(fuente2);
            sep.add(".");
            pdf.add(sep);

            // ENCABEZADO DE LA TABLA
            PdfPTable table = new PdfPTable(7);
            table.setTotalWidth(2000);
            PdfPCell cell1 = new PdfPCell(new Paragraph("cliente", fuente2));
            table.addCell(cell1);
//            PdfPCell cell2 = new PdfPCell(new Paragraph("pedido",fuente2));
//            table.addCell(cell2);
            PdfPCell cell3 = new PdfPCell(new Paragraph("Fact./Rem.", fuente2));
            table.addCell(cell3);
            PdfPCell cell4 = new PdfPCell(new Paragraph("dias credito", fuente2));
            table.addCell(cell4);
            PdfPCell cell5 = new PdfPCell(new Paragraph("fecha inicio", fuente2));
            table.addCell(cell5);
            PdfPCell cell6 = new PdfPCell(new Paragraph("fecha vencido", fuente2));
            table.addCell(cell6);
            PdfPCell cell7 = new PdfPCell(new Paragraph("dias vencido", fuente2));
            table.addCell(cell7);
            PdfPCell cell8 = new PdfPCell(new Paragraph("adeudo", fuente2));
            table.addCell(cell8);

            Vector<Double> adeudos = new Vector();
            int contAux = 0;
            for (contAux = 0; contAux < registros.size(); contAux++) {
                CarteraVencidaDTO c = (CarteraVencidaDTO) registros.elementAt(contAux);

                PdfPCell x = new PdfPCell(new Paragraph(clientesDAO.razonSocialPorID(c.getIdCliente()) + "", fuente2));
                table.addCell(x);
                PdfPCell x2 = new PdfPCell(new Paragraph(registroEnvio.folioFiscalPedido(c.getIdPedido()) + "", fuente2));
                table.addCell(x2);
                PdfPCell x3 = new PdfPCell(new Paragraph(c.getDiasCredito() + "", fuente2));
                table.addCell(x3);
                PdfPCell xinicio = new PdfPCell(new Paragraph(c.getFechaInicioCredito() + "", fuente2));
                table.addCell(xinicio);
                PdfPCell x4 = new PdfPCell(new Paragraph(c.getFechaVencimientoCredito() + "", fuente2));
                table.addCell(x4);
                PdfPCell x5 = new PdfPCell(new Paragraph(c.getDiasVencido() + "", fuente2));
                table.addCell(x5);
                PdfPCell x6 = new PdfPCell(new Paragraph("" + pedidosDAO.montoTotalPedido(c.getIdPedido()) + "", fuente2));

                table.addCell(x6);
                adeudos.add(pedidosDAO.montoTotalPedido(c.getIdPedido()));
            }
            pdf.add(table);

            Herramientas h = new Herramientas();
            double totalAdeudo = h.sumaItemsVector(adeudos);
            String totalAdeudoFomato = h.redondeaDecimales(totalAdeudo);

            Paragraph total = new Paragraph();
            total.setAlignment(Element.ALIGN_RIGHT);
            total.setFont(fuenteTitulo);
            total.add("TOTAL VENCIDO : $" + totalAdeudoFomato + "");
            pdf.add(total);
            pdf.close();

//            // ENCABEZADO DE LA TABLA
//            PdfPTable table = new PdfPTable(1);
//            table.setTotalWidth(2000);
//            PdfPCell cell1 = new PdfPCell(new Paragraph("cliente", fuenteTitulo));
//            table.addCell(cell1);
//            cell1.setBorder(Rectangle.NO_BORDER);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rutaSalida;
    }

    /**
     * ALAN GONZALEZ METODO PARA REALIZAR UNA ORDEN DE COMPRA
     *
     * @param registros
     * @return
     */
    public String OrdenCompra(int folio) {

        Herramientas h = new Herramientas();
        ClientesDAO clientesDAO = new ClientesDAO();
        ComprasDAO comprasDAO = new ComprasDAO();
        CalendarioDAO calendario = new CalendarioDAO();
        OrdenCompraDTO ordenCompra = new OrdenCompraDTO();
        ordenCompra = comprasDAO.ordenCompraPorFolio(folio);

        String tituloDocumento = "ORDEN DE COMPRA";
        String nombreReporteAleatorio = h.cadenaAlfanumericaAleatoria(4);
        String rutaSalida = "C:/erp_reports/OrdenCompra_" + folio + ".pdf";
        //Document pdf = new Document(PageSize.A4.rotate());
        Document pdf = new Document();
        try {
            PdfWriter.getInstance(pdf, new FileOutputStream(rutaSalida));
            pdf.open();

            Image logo = Image.getInstance("C:/erpDocsResources/logo.png");
            logo.setAlignment(Element.ALIGN_LEFT);
            logo.scaleAbsolute(80f, 60f);
            pdf.add(logo);

            Font fuenteTitulo = new Font();
            fuenteTitulo.setSize(12);
            fuenteTitulo.setStyle(1);
            fuenteTitulo.setFamily(BaseFont.COURIER);
            fuenteTitulo.setColor(BaseColor.BLACK);

            // SE EDITA EL REPORTE PARA TENER ALINEADO AMBOS PARRAFOS DE CABECERA
            PdfPTable tableHeader = new PdfPTable(2);
            tableHeader.setWidthPercentage(100);
            tableHeader.setWidths(new int[]{5, 5});

            // CELDA 1 IZQUIERDA
            Paragraph dulcesTarryTitle = new Paragraph();
            dulcesTarryTitle.setFont(fuenteTitulo);
            dulcesTarryTitle.add(" DULCES TARRY ");

            PdfPCell celdaDulcesTarryTitle = new PdfPCell(dulcesTarryTitle);
            celdaDulcesTarryTitle.setHorizontalAlignment(Element.ALIGN_LEFT);
            celdaDulcesTarryTitle.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaDulcesTarryTitle);

            // CELDA 2 DERECHA
            Paragraph folioOrdenTitulo = new Paragraph();
            folioOrdenTitulo.setFont(fuenteTitulo);
            folioOrdenTitulo.add(" ORDEN DE COMPRA");

            PdfPCell celdafolioOrdenTitulo = new PdfPCell(folioOrdenTitulo);
            celdafolioOrdenTitulo.setHorizontalAlignment(Element.ALIGN_RIGHT);
            celdafolioOrdenTitulo.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdafolioOrdenTitulo);

            // CELDA 3 IZQUIERDA
            Paragraph direccionTarry = new Paragraph();
            direccionTarry.setFont(fuenteTitulo);
            direccionTarry.add(" Benito Juarez 12 ");

            PdfPCell celdaDireccionTarry = new PdfPCell(direccionTarry);
            celdaDireccionTarry.setHorizontalAlignment(Element.ALIGN_LEFT);
            celdaDireccionTarry.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaDireccionTarry);

            // CELDA 4 DERECHA
            Paragraph folioOrdenCompra = new Paragraph();
            folioOrdenCompra.setFont(fuenteTitulo);
            folioOrdenCompra.add(" ORDEN DE COMPRA : " + folio);

            PdfPCell celdaFolioOrdenCompra = new PdfPCell(folioOrdenCompra);
            celdaFolioOrdenCompra.setHorizontalAlignment(Element.ALIGN_RIGHT);
            celdaFolioOrdenCompra.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaFolioOrdenCompra);

            // CELDA 5 IZQUIERDA
            Paragraph colonia = new Paragraph();
            colonia.setFont(fuenteTitulo);
            colonia.add(" Col. Santa Martha Acatitla ");
            
            PdfPCell celdaColonia = new PdfPCell(colonia);
            celdaColonia.setHorizontalAlignment(Element.ALIGN_LEFT);
            celdaColonia.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaColonia);
            
            // CELDA 6 DERECHA
            Paragraph fechaElaboracionTitulo = new Paragraph();
            fechaElaboracionTitulo.setFont(fuenteTitulo);
            fechaElaboracionTitulo.add("Fecha De Elaboracion");
            
            PdfPCell celdaFechaElaboracionTitulo = new PdfPCell(fechaElaboracionTitulo);
            celdaFechaElaboracionTitulo.setHorizontalAlignment(Element.ALIGN_RIGHT);
            celdaFechaElaboracionTitulo.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaFechaElaboracionTitulo);
            
            // CELDA 7 IZQUIERDA
            
            Paragraph ciudad = new Paragraph();
            ciudad.setFont(fuenteTitulo);
            ciudad.add(" Mexico D.F. C.P. 09510 ");
            
            PdfPCell celdaCiudad = new PdfPCell(ciudad);
            celdaCiudad.setHorizontalAlignment(Element.ALIGN_LEFT);
            celdaCiudad.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaCiudad);
            
            // CELDA 8 DERECHA
            Paragraph fechaElaboracion = new Paragraph();
            fechaElaboracion.setFont(fuenteTitulo);
            fechaElaboracion.add(calendario.fechaEspañol(ordenCompra.getFechaCreacion()));
            
            PdfPCell celdaFechaElaboracion = new PdfPCell(fechaElaboracion);
            celdaFechaElaboracion.setHorizontalAlignment(Element.ALIGN_RIGHT);
            celdaFechaElaboracion.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaFechaElaboracion);
            
            // CELDA 9 IZQUIERDA
            Paragraph telefonos = new Paragraph();
            telefonos.setFont(fuenteTitulo);
            telefonos.add(" 5732-8264 y 5733-5318 ");
            
            PdfPCell celdaTelefonos = new PdfPCell(telefonos);
            celdaTelefonos.setHorizontalAlignment(Element.ALIGN_LEFT);
            celdaTelefonos.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaTelefonos);
            
            // CELDA 10 DERECHA 
            Paragraph fechaEntregaTitulo = new Paragraph();
            fechaEntregaTitulo.setFont(fuenteTitulo);
            fechaEntregaTitulo.add(" Fecha De Entrega");

            PdfPCell celdaFechaEntregaTitulo = new PdfPCell(fechaEntregaTitulo);
            celdaFechaEntregaTitulo.setHorizontalAlignment(Element.ALIGN_RIGHT);
            celdaFechaEntregaTitulo.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaFechaEntregaTitulo);
            
            // CELDA 11 IZQUIERDA
            Paragraph email = new Paragraph();
            email.setFont(fuenteTitulo);
            email.add(" compras@tarry.com.mx ");
            
            PdfPCell celdaEmail = new PdfPCell(email);
            celdaEmail.setHorizontalAlignment(Element.ALIGN_LEFT);
            celdaEmail.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaEmail);
            
            // CELDA 12 DERECHA
            Font fechaEntregaFuente = new Font();
            fechaEntregaFuente.setSize(11);
            fechaEntregaFuente.setStyle(1);
            fechaEntregaFuente.setFamily(BaseFont.COURIER);
            fechaEntregaFuente.setColor(BaseColor.RED);

            Paragraph fechaEntrega = new Paragraph();
            fechaEntrega.setFont(fechaEntregaFuente);
            fechaEntrega.add(calendario.fechaEspañol(ordenCompra.getFechaEntrega()));
            
            PdfPCell celdaFechaEntrega = new PdfPCell(fechaEntrega);
            celdaFechaEntrega.setHorizontalAlignment(Element.ALIGN_RIGHT);
            celdaFechaEntrega.setBorder(Rectangle.NO_BORDER);
            tableHeader.addCell(celdaFechaEntrega);
            
            pdf.add(tableHeader);

            Paragraph separador = new Paragraph();
            separador.setAlignment(Element.ALIGN_CENTER);
            separador.add(".");
            pdf.add(separador);
            
            // ################################################### ################################################### 
            // ################################ ENCABEZADOPS DE TABLA Y ELEMENTOS DINAMICOS   ######################## 
            // ################################################### ################################################### 
            
// ENCABEZADO DE LA TABLA
            PdfPTable table = new PdfPTable(5);
            table.setWidthPercentage(100);
            table.setWidths(new int[]{8, 2, 1, 2, 2});

            Font fuenteTitulosTabla = new Font();
            fuenteTitulosTabla.setSize(10);
            fuenteTitulosTabla.setStyle(1);
            fuenteTitulosTabla.setFamily(BaseFont.COURIER);
            fuenteTitulosTabla.setColor(BaseColor.BLACK);

            PdfPCell celdaDescripcionTitulo = new PdfPCell(new Paragraph("DESCRIPCION", fuenteTitulosTabla));
            celdaDescripcionTitulo.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(celdaDescripcionTitulo);

            PdfPCell celdaCantidadTitulo = new PdfPCell(new Paragraph("CANTIDAD", fuenteTitulosTabla));
            celdaCantidadTitulo.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(celdaCantidadTitulo);

            PdfPCell celdaUnidadMedidaTitulo = new PdfPCell(new Paragraph("U.M.", fuenteTitulosTabla));
            celdaUnidadMedidaTitulo.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(celdaUnidadMedidaTitulo);

            PdfPCell celdaPrecioUnitarioTitulo = new PdfPCell(new Paragraph("P.U.", fuenteTitulosTabla));
            celdaPrecioUnitarioTitulo.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(celdaPrecioUnitarioTitulo);

            PdfPCell celdaImporteTitulo = new PdfPCell(new Paragraph("IMPORTE", fuenteTitulosTabla));
            celdaImporteTitulo.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(celdaImporteTitulo);

// ELEMENTO DINAMICO 
            int contAux = 0;
            Vector<ConceptoOrdenCompraDTO> conceptos = new Vector();

            conceptos = comprasDAO.conceptosCompra(folio);
            double totalCompra = comprasDAO.totalConceptosOrdenCompra(folio);
            String subTotalCompraDecimales = h.redondeaDecimales(totalCompra);

            for (contAux = 0; contAux < conceptos.size(); contAux++) {
                ConceptoOrdenCompraDTO conceptoDTO = conceptos.elementAt(contAux);

                PdfPCell datoConcepto = new PdfPCell(new Paragraph("" + conceptoDTO.getConcepto(), fuenteTitulosTabla));
                table.addCell(datoConcepto);

                PdfPCell datoCantidad = new PdfPCell(new Paragraph("" + conceptoDTO.getCantidad(), fuenteTitulosTabla));
                table.addCell(datoCantidad);

                PdfPCell datoUnidadMerdida = new PdfPCell(new Paragraph("" + conceptoDTO.getUnidadMedida(), fuenteTitulosTabla));
                datoUnidadMerdida.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.addCell(datoUnidadMerdida);

                PdfPCell datoPrecioUnitario = new PdfPCell(new Paragraph("" + conceptoDTO.getPrecioUnitario(), fuenteTitulosTabla));
                table.addCell(datoPrecioUnitario);

                PdfPCell datoImporte = new PdfPCell(new Paragraph("" + conceptoDTO.getTotalConcepto(), fuenteTitulosTabla));
                table.addCell(datoImporte);
            }

            PdfPCell colspan1 = new PdfPCell(new Paragraph("SubTotal :", fuenteTitulosTabla));
            colspan1.setColspan(4);
            colspan1.setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(colspan1);

            PdfPCell totalDeCompra = new PdfPCell(new Paragraph(subTotalCompraDecimales, fuenteTitulosTabla));
            table.addCell(totalDeCompra);

            PdfPCell colspan2 = new PdfPCell(new Paragraph("I.V.A. :", fuenteTitulosTabla));
            colspan2.setColspan(4);
            colspan2.setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(colspan2);

            PdfPCell montoIva = new PdfPCell(new Paragraph("0", fuenteTitulosTabla));
            table.addCell(montoIva);

            PdfPCell colspan3 = new PdfPCell(new Paragraph("Total :", fuenteTitulosTabla));
            colspan3.setColspan(4);
            colspan3.setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(colspan3);

            PdfPCell total = new PdfPCell(new Paragraph("0 ", fuenteTitulosTabla));
            table.addCell(total);

            pdf.add(table);

            Font fuenteDetallesCompra = new Font();
            fuenteDetallesCompra.setSize(8);
            fuenteDetallesCompra.setStyle(1);
            fuenteDetallesCompra.setFamily(BaseFont.COURIER);
            fuenteDetallesCompra.setColor(BaseColor.BLACK);

            Paragraph separador2 = new Paragraph();
            separador2.setAlignment(Element.ALIGN_CENTER);
            separador2.setFont(fuenteTitulo);
            separador2.add(".");
            pdf.add(separador2);

            Paragraph msj1 = new Paragraph();
            msj1.setAlignment(Element.ALIGN_LEFT);
            msj1.setFont(fuenteDetallesCompra);
            msj1.add("Para recepción de materiales: apegarse a los registros de calidad vigentes a la fecha");
            pdf.add(msj1);

            Paragraph msj2 = new Paragraph();
            msj2.setAlignment(Element.ALIGN_LEFT);
            msj2.setFont(fuenteDetallesCompra);
            msj2.add("Anexar certificado de calidad y copia de este pedido, de acuerdo a especificaciones vigentes a la fecha");
            pdf.add(msj2);

            Paragraph msj3 = new Paragraph();
            msj3.setAlignment(Element.ALIGN_LEFT);
            msj3.setFont(fuenteDetallesCompra);
            msj3.add("A Respetar las entregas en la fecha citada.");
            pdf.add(msj3);

            Paragraph msj4 = new Paragraph();
            msj4.setAlignment(Element.ALIGN_LEFT);
            msj4.setFont(fuenteDetallesCompra);
            msj4.add("1) Favor de confirmar la fecha de entrega y el horario para considerarlo dentro del almacén");
            pdf.add(msj4);

            Paragraph msj5 = new Paragraph();
            msj5.setAlignment(Element.ALIGN_LEFT);
            msj5.setFont(fuenteDetallesCompra);
            msj5.add("2) El día de la entrega se requiere certificado de calidad, resultado de la prueba microbiológica y características del producto.");
            pdf.add(msj5);

            Paragraph msj6 = new Paragraph();
            msj6.setAlignment(Element.ALIGN_LEFT);
            msj6.setFont(fuenteDetallesCompra);
            msj6.add("3) A la entrega deberan presentar factura original y tres copias.");
            pdf.add(msj6);

            Paragraph msj7 = new Paragraph();
            msj7.setAlignment(Element.ALIGN_LEFT);
            msj7.setFont(fuenteDetallesCompra);
            msj7.add("4) Copia de la Orden de Compra");
            pdf.add(msj7);

            pdf.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return rutaSalida;
    }
}
